/*
 * TITLE:GameThread
 * AUTHOR:Manori Thakur
 * PURPOSE: Separate thread to update physics and render screen of the game, Maintains steady
 * frame rate
 */
package com.example.android.debuggermenu;

import clientcore.GameState;
import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;

public class GameThread extends Thread {
    private static final String TAG = GameThread.class.getSimpleName();

    private SurfaceHolder surfaceHolder;
    private GameView gameView;
    private Canvas canvas;

    // flag to hold game state
    private boolean running;
    
    //flag to check if the thread is being created anew, or renewed from being paused
    private boolean paused;

    // desired fps
    private final static int MAX_FPS = 15;
    // maximum number of frames to be skipped
    private final static int MAX_FRAME_SKIPS = 2;
    // the frame period
    private final static int FRAME_PERIOD = 1000 / MAX_FPS;

    private long tickCount = 0L;
    
    public GameThread(SurfaceHolder surfaceHolder,GameView gameView) {
        super();
        this.surfaceHolder = surfaceHolder;
        this.gameView = gameView;        
        tickCount=0L;
        GameState.clearQuestion();
    }

    public void setRunning(boolean running) {
        this.running = running;
    }
    
    public void setPaused(boolean paused) {
    	this.paused = paused;
    }
    
    public boolean getPaused() {
    	return paused;
    }

    @Override
    public void run() {

        //Looper.prepare();
        
        
        Log.d(TAG, "Starting game loop");
        
        long beginTime;		// the time when the cycle begun
		long timeDiff;		// the time it took for the cycle to execute
		int sleepTime;		// ms to sleep (<0 if we're behind)
		int framesSkipped;	// number of frames being skipped
		sleepTime = 0;

        while (running) {
            tickCount++;
            canvas = null;
            
            // try locking the canvas for exclusive pixel editing on the surface
            try {
                canvas = this.surfaceHolder.lockCanvas();
                synchronized(surfaceHolder) {
                    beginTime = System.currentTimeMillis();
		            framesSkipped = 0;	// resetting the frames skipped
		    
                    if(!GameState.hasQuestion()) {
                    	
                    // update game state                    
                    this.gameView.update();
                    this.gameView.render(canvas);
                    }
                    // render state to the screen
                    // draws the canvas on the panel
                    
                    
                    // calculate how long did the cycle take
                    timeDiff = System.currentTimeMillis() - beginTime;
                    // calculate sleep time
                    sleepTime = (int)(FRAME_PERIOD - timeDiff);
                    if (sleepTime > 0) {
                        // if sleepTime > 0 we're OK
                        try {
                            // send the thread to sleep for a short period
                            // very useful for battery saving
                            Thread.sleep(sleepTime);
                        } catch (InterruptedException e) {}
                    }
		    while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
					// we need to catch up
					this.gameView.update(); // update without rendering
					sleepTime += FRAME_PERIOD;	// add frame period to check if in next frame
					framesSkipped++;
           }
		}
            } finally {
                // in case of an exception the surface is not left in an inconsistent state
                if(canvas != null) {
                    this.surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
            
        }
        //Looper.loop();
        //Looper.getMainLooper().quit();
        Log.d(TAG, "Game loop executed " + tickCount + " times");
    }
}
